package grafica;

import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import editor.EditorFrame;
import game.GameCore;

import javax.swing.*;

import sprite.Giocatore;
import store.Classifica;
import store.Coordinate;
import store.Posizione;
import store.SaveLoad;

public class Myframe extends JFrame implements ActionListener {
	
	public static final int SCREEN_WIDTH = 800;
	public static final int SCREEN_HEIGHT = 630;
	private JPanel pannelloPrincipale;
	private JMenuBar menuBar;
	private JMenuItem save;
	private JMenuItem newgame;
	private JMenuItem load;
	private JMenuItem quit;
	private MenuPanel menu;
	private GameCore gcCorrente;
	private GamePanel pannelloGioco;
	Classifica classifica;
	
	public Myframe() {
		super();	
		menu = new MenuPanel(this);
		creaBarra();
		pannelloPrincipale = new JPanel();
		pannelloPrincipale.setLayout(new BorderLayout());
		this.setSize(SCREEN_WIDTH,SCREEN_HEIGHT);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		pannelloPrincipale.add(BorderLayout.CENTER,menu);
		this.setContentPane(pannelloPrincipale);
		this.setTitle("Unicalman");	
		this.setLocation(210,50);
		this.setResizable(false);
		classifica = new Classifica();
	}
	
	public void creaBarra(){
		menuBar = new JMenuBar();
		menuBar.setLayout(new FlowLayout());
		save = new JMenuItem("Save");
		load = new JMenuItem("Load");
		newgame = new JMenuItem("New");
		quit = new JMenuItem("Quit");	
		load.addActionListener(this);
		save.addActionListener(this);
		newgame.addActionListener(this);
		quit.addActionListener(this);
		menuBar.add(newgame);
		menuBar.add(save);
		menuBar.add(load);
		menuBar.add(quit);
	}
	
	public void changePanel(Giocatore player,int idLivello,boolean cambioLivello,boolean type) {
		GameCore game = new GameCore(idLivello,type);
		gcCorrente = game;
		game.getPlayers().get(0).setVite(player.getVite());
		game.getPlayers().get(0).setPunteggio(player.getPunteggio());
		if(!cambioLivello) {
			for(Coordinate c : player.getCoordinateTile()) {
				int i = c.getX();
				int j = c.getY();
				game.getLevel().setMappaElement(i, j, null);
				game.getPlayers().get(0).getCoordinateTile().add(new Coordinate(i,j));
			}
		}
		pannelloGioco = new GamePanel(game.getLevel(),this);
		pannelloPrincipale.removeAll();
		pannelloPrincipale.add(BorderLayout.NORTH,menuBar);
		pannelloPrincipale.add(BorderLayout.CENTER,pannelloGioco);
		pannelloPrincipale.updateUI();	
		pannelloGioco.requestFocus();
	}
	
	public void loadPanel( ){
		GameCore game = new GameCore (SaveLoad.carica());
		gcCorrente = game;
		pannelloGioco = new GamePanel(game.getLevel(),this);
		pannelloPrincipale.removeAll();
		pannelloPrincipale.add(BorderLayout.CENTER,pannelloGioco);
		pannelloPrincipale.add(BorderLayout.NORTH,menuBar);
		pannelloPrincipale.updateUI();
		pannelloGioco.repaint();
		pannelloGioco.requestFocus();	
	}
	
	public void nextPanel(Giocatore player,int idLivello,boolean type) {
		NextLevelPanel nextpanel = new NextLevelPanel(idLivello,this,player,type);
		pannelloPrincipale.removeAll();
		pannelloPrincipale.add(BorderLayout.CENTER,nextpanel);
		pannelloPrincipale.updateUI();	
	}
	
	
	public void avviaPartita(int livelloCorrente,boolean type) {
		GameCore game = new GameCore(livelloCorrente,type);
		gcCorrente = game;
		SaveLoad.salva(gcCorrente);
		pannelloGioco = new GamePanel(game.getLevel(),this);
		pannelloPrincipale.removeAll();
		pannelloPrincipale.add(BorderLayout.CENTER,pannelloGioco);
		pannelloPrincipale.add(BorderLayout.NORTH,menuBar);
		pannelloPrincipale.updateUI();
		pannelloGioco.requestFocus();			
	}
	
	public void gameOver() {
		Posizione p = new Posizione(gcCorrente.getLevel().getPlayerAt(0).getNome(),gcCorrente.getLevel().getPlayerAt(0).getPunteggio());
		classifica.addinClassifica(p, classifica);
		classifica.scrivi();
		
		GameOver over = new GameOver(this);
		pannelloPrincipale.removeAll();
		pannelloPrincipale.add(BorderLayout.CENTER,over);
		pannelloPrincipale.updateUI();
		over.requestFocus();					
	}
	public void vittoria() {
		Posizione p = new Posizione("Megaman",gcCorrente.getLevel().getPlayerAt(0).getPunteggio());
		classifica.addinClassifica(p, classifica);
		classifica.scrivi();
		
		EndPanel vittoria = new EndPanel(this);
		pannelloPrincipale.removeAll();
		pannelloPrincipale.add(BorderLayout.CENTER,vittoria);
		pannelloPrincipale.updateUI();
		vittoria.requestFocus();					
	}
	
	public void menu() {
		MenuPanel menu = new MenuPanel(this);
		pannelloPrincipale.removeAll();
		pannelloPrincipale.add(BorderLayout.CENTER,menu);
		pannelloPrincipale.updateUI();
		menu.requestFocus();		
	}
	
	public void avviaEditor() {
		new EditorFrame();
	}
	
	public MenuPanel getMenu() {
		return menu;
	}
	
	public void classificaPanel(){
		ClassificaPanel cPanel = new ClassificaPanel(this);
		pannelloPrincipale.removeAll();
		pannelloPrincipale.add(BorderLayout.CENTER,cPanel);
		pannelloPrincipale.updateUI();
		cPanel.requestFocus();	
	}

	public void actionPerformed(ActionEvent e) {
		if( e.getSource() == save ){
			SaveLoad.salva(gcCorrente);
		}
		else if(e.getSource() == load){
			gcCorrente.getLevel().getSottofondo().stop(1);
			loadPanel();
		}
		else if (e.getSource() == quit){
			gcCorrente.getLevel().getSottofondo().stop(1);
			menu();
		}
		else if (e.getSource() == newgame){
			gcCorrente.getLevel().getSottofondo().stop(1);
			nextPanel(null, 0, true);
		}
	}
}
